From 15e2076e871b88be9b6fff02d1acb605ad9fb365 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 23 Sep 2014 22:10:32 -0700 Subject: [PATCH] Allow "cycles" through dev-deps Development dependencies can never be the root of a cycle because nothing depends on a development dependency, so there's no need to track the start of a cycle at the edge going out to a development dependency. If a cycle is later detected, it will still be reported. --- src/cargo/core/resolver.rs | 20 +++++++++++++------- tests/test_cargo_compile.rs | 4 ++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/cargo/core/resolver.rs b/src/cargo/core/resolver.rs index d33bfe618..d2af447b6 100644 --- a/src/cargo/core/resolver.rs +++ b/src/cargo/core/resolver.rs @@ -315,12 +315,6 @@ fn resolve_deps<'a, R: Registry>(parent: &Summary, method: ResolveMethod, ctx: &mut Context<'a, R>) -> CargoResult<()> { - // Dependency graphs are required to be a DAG - if !ctx.visited.insert(parent.get_package_id().clone()) { - return Err(human(format!("Cyclic package dependency: package `{}` \ - depends on itself", parent.get_package_id()))) - } - let dev_deps = match method { ResolveEverything => true, ResolveRequired(dev_deps, _, _) => dev_deps, @@ -402,13 +396,25 @@ fn resolve_deps<'a, R: Registry>(parent: &Summary, ctx.seen.insert((name, source_id), version.clone()); ctx.resolve.graph.add(summary.get_package_id().clone(), []); } + + // Dependency graphs are required to be a DAG. Non-transitive + // dependencies (dev-deps), however, can never introduce a cycle, so we + // skip them. + if dep.is_transitive() && + !ctx.visited.insert(summary.get_package_id().clone()) { + return Err(human(format!("Cyclic package dependency: package `{}` \ + depends on itself", + summary.get_package_id()))) + } try!(resolve_deps(summary, ResolveRequired(false, dep.get_features(), dep.uses_default_features()), ctx)); + if dep.is_transitive() { + ctx.visited.remove(summary.get_package_id()); + } } - ctx.visited.remove(parent.get_package_id()); Ok(()) } diff --git a/tests/test_cargo_compile.rs b/tests/test_cargo_compile.rs index 7a9ed2a03..764e7524c 100644 --- a/tests/test_cargo_compile.rs +++ b/tests/test_cargo_compile.rs @@ -1082,8 +1082,8 @@ test!(self_dependency { "#) .file("src/test.rs", "fn main() {}"); assert_that(p.cargo_process("build"), - execs().with_status(101).with_stderr("\ -Cyclic package dependency: package `test v0.0.0 ([..])` depends on itself + execs().with_status(0).with_stdout("\ +[..] test v0.0.0 ([..]) ")); }) -- 2.30.2